Spring MVC 애플리케이션 서버에서 HTTP 요청이 처리되는 과정
클라이언트가 HTTP 요청을 Spring MVC 웹 애플리케이션으로 전송하면, 서버 내부에서는 복잡한 워크플로우가 가동됩니다. 이 과정은 네트워크의 요청을 애플리케이션 로직으로 변환하여, 최종적으로 응답을 반환하기까지의 모든 단계를 포함합니다.
1. 요청 진입: 네트워크 & 서블릿 컨테이너
- **HTTP 요청이 서버(예: Tomcat, Jetty 등)**에 도착합니다.
- 서블릿 컨테이너가 외부에서 들어오는 요청을 리스닝하고, 관련 서블릿에 전달합니다.
2. 필터 체인
- Filter(javax.servlet.Filter)들이 실행되어, Spring MVC 본처리 전에 동작합니다.
- 예시: 보안(인증/인가), 로깅, CORS, 요청 인코딩 등
- 필터는 요청을 변경, 차단, 래핑할 수 있습니다.
3. 프론트 컨트롤러: DispatcherServlet
- 모든 요청은 DispatcherServlet이라는 중앙 컴포넌트로 전달됩니다.
- 애플리케이션 시작 시 등록되며, 보통 URL 패턴
/으로 매핑됨
- 애플리케이션 시작 시 등록되며, 보통 URL 패턴
- DispatcherServlet은 프론트 컨트롤러 역할을 하며, 모든 웹 요청이 여기서 시작합니다.
4. 컨텍스트 준비
- 해당 요청에 대해 WebApplicationContext(컨트롤러, 서비스 빈 등)가 사용 가능해집니다.
- 다국어/테마 처리를 위한 LocaleResolver, ThemeResolver가 추가될 수 있습니다.
5. 파일 업로드 처리(Multipart)
- 파일 업로드 요청일 경우 MultipartResolver가 요청을 파싱 및 래핑합니다.
6. 핸들러 매핑(Controller 찾기)
- DispatcherServlet은 HandlerMapping을 이용하여, 요청의 URL/HTTP 메서드/헤더 등에 따라 해당 컨트롤러를 결정합니다.
@RequestMapping기반 또는 다양한 핸들러 매핑 지원
7. 인터셉터(HandlerInterceptor)
- 컨트롤러 진입 전 인터셉터에서 공통 로직 수행
- 인증, 로깅, 입력 검증 등
preHandle(),postHandle(),afterCompletion()훅 지원
8. 핸들러 어댑터(컨트롤러 메서드 실행)
- DispatcherServlet이 HandlerAdapter를 통해 컨트롤러 메서드를 실행합니다(보통 어노테이션 기반).
- HandlerAdapter는
- 메서드 파라미터 바인딩(쿼리, 폼, JSON, 경로변수, @ModelAttribute 등)
- 컨트롤러 메서드 실제 호출을 담당합니다.
9. 컨트롤러 메서드 실행
- 매칭된 컨트롤러 메서드가 호출되어
- 비즈니스 로직 실행(서비스 빈, DB, 외부 API 등 호출)
- 일반적으로 ModelAndView 또는 데이터 객체를 반환
- 논리적 뷰 이름(예:
home,user/list) - 뷰에서 사용할 모델 데이터
- 논리적 뷰 이름(예:
10. 예외 처리
- 컨트롤러 내에서 예외가 발생하면 HandlerExceptionResolver가 이를 처리합니다.
- 커스텀 오류페이지, API 에러 응답 반환, 혹은 예외 재전파 가능
11. 뷰 리졸브
- 논리적 뷰 이름일 경우 ViewResolver가 실제 뷰(JSP, Thymeleaf 등)로 매핑
- REST/JSON 응답이면 MessageConverter(Jackson 등)가 객체를 JSON 문자열로 직렬화 후 응답바디에 기록
12. 뷰 렌더링
- 뷰 템플릿 엔진(JSP, Thymeleaf 등)이 모델 데이터를 사용해 실제 HTML/JSON 등 결과물을 생성
- 결과(output)는 HttpServletResponse에 기록됨
13. 인터셉터 후처리
- 컨트롤러 or 뷰 렌더링 이후,
postHandle(),afterCompletion()등 인터셉터 메서드가 실행되어 자원 정리/로깅 등 수행
14. 응답 필터링
- 응답이 서버에서 나가기 직전, 출력용 필터(압축, 로깅 등)를 다시 거침
15. 응답 반환
- 최종적으로 서블릿 컨테이너가 응답을 클라이언트(브라우저/REST 클라이언트)에 전송
요약 표: Spring MVC 내부 요청 라이프사이클
| 단계 | 담당 컴포넌트 | 주요 역할 |
|---|---|---|
| 1. 요청 진입 | 서블릿 컨테이너 | HTTP 요청 수신 |
| 2. 필터 처리 | Filter | 보안, 로깅 등 사전 처리 |
| 3. 프론트컨트롤러 | DispatcherServlet | 라우팅/중앙제어 |
| 4. 핸들러 매핑 | HandlerMapping | 컨트롤러 결정 |
| 5. 사전 인터셉터 | HandlerInterceptor | 컨트롤러 진입 전 커스텀로직 |
| 6. 컨트롤러 실행 | HandlerAdapter+Controller | 비즈니스 로직, 모델 준비 |
| 7. 예외 처리 | HandlerExceptionResolver | 에러 처리 |
| 8. 뷰 리졸브 | ViewResolver | 논리적 뷰 → 실제 뷰 매핑 |
| 9. 뷰 렌더링 | View(JSP, Thymeleaf 등) | HTML/JSON 등 실제 결과 생성 |
| 10. 후처리 인터셉터 | HandlerInterceptor | 응답 직후 로깅/정리 |
| 11. 응답 필터링 | Filter | 응답 압축/로깅 등 |
| 12. 응답 송출 | 서블릿 컨테이너 | 최종 응답 반환 |
추가: 고급 기능
- 세션 관리: 세션 속성/빈 등을 이용한 사용자 로그인, 장바구니 등 세션 상태 관리 가능
- 데이터 바인딩/검증: HTTP 요청 파라미터와 바디를 자동으로 자바 객체로 매핑/유효성 검사(@Valid 등)
- 비동기 처리: DeferredResult, Callable 등으로 비동기 요청 지원
결론
Spring MVC는 네트워크, 보안, 비즈니스, 뷰 렌더링을 분리한 계층적 확장 구조로, 모든 단계별로 커스텀 및 확장이 가능하며, 재사용성과 유지보수성, 테스트 용이성이 뛰어납니다.
서블릿이란?
**서블릿(servlet)**은 웹 서버에서 실행되며 웹 클라이언트(대개 웹 브라우저)로부터의 요청을 처리하는 특별한 자바 프로그램입니다. Java 기반 웹 애플리케이션(예: JSP 웹사이트)에서 동적 컨텐츠 생성(폼 처리, DB 접근, 연산 데이터 반환 등)을 담당하는 주체입니다.
핵심 개념
- 서블릿은 서버에서 실행되는 자바 클래스입니다. (클라이언트가 아닌 서버 측 수행)
- Jakarta EE(이전 Java EE)의 Servlet API에 포함되어 있습니다.
- 서블릿 컨테이너 또는 웹 컨테이너(예: Tomcat, Jetty, GlassFish 등)가 서블릿의 실행/관리를 담당합니다.
동작 방식
-
배포
- 개발자가 서블릿 클래스를 작성(
HttpServlet상속), 패키징 후 서블릿 컨테이너에 배포합니다.
- 개발자가 서블릿 클래스를 작성(
-
요청/응답 흐름
- 클라이언트(브라우저)가 HTTP 요청을 서버로 보냅니다(예: 폼 제출, 링크 클릭).
- 서버의 서블릿 컨테이너가 요청 URL에 맞는 서블릿을 찾습니다.
- 서블릿 컨테이너가 서블릿의 라이프사이클(생성, 초기화, 호출 등)을 관리합니다.
- 서블릿은 요청객체(
HttpServletRequest)를 받아 내부 비즈니스 로직을 처리한 뒤, 응답객체(HttpServletResponse)에 결과(HTML, JSON 등)를 담아 클라이언트로 보냅니다.
-
라이프사이클 관리
- 서블릿 컨테이너는 서블릿의 로딩,
init(),service(),destroy()호출 시점, 동시성 등도 책임집니다.
- 서블릿 컨테이너는 서블릿의 로딩,
-
동적 컨텐츠
- 서블릿은 HTML, JSON, 파일 등을 생성해 응답하거나, 리다이렉트/포워딩할 수도 있습니다.
실전 예시
- 로그인 폼이
/login으로 submit 되면, 이 URL이 서블릿에 매핑되어 아이디·비밀번호 검증 후 성공/실패 응답 또는 페이지를 반환합니다. - 모든 Java 웹 프레임워크(Spring MVC 등)도 기본적으로 서블릿 API 위에서 동작합니다.
왜 서블릿 컨테이너가 필요한가?
- 자바 클래스 자체는 HTTP 통신을 직접 처리할 수 없습니다.
- 서블릿 컨테이너가 서블릿의 실행 환경을 제공하며, 네트워크 관리, URL 매핑, 요청 분배, 스레드 관리, 보안, 자원 관리 등을 도와줍니다.
- 대표적 서블릿 컨테이너: Tomcat, Jetty, GlassFish, WildFly, WebLogic 등
정리하자면:
서블릿은 서블릿 컨테이너가 관리하는 서버 측 자바 프로그램으로, 웹 요청을 받아 처리한 뒤 응답하는 역할을 하며, 자바 웹 애플리케이션이 동적 서비스를 제공할 수 있게 해줍니다.
references